﻿using System;
using System.Collections.Generic; // gerir notkun á sniðmátum möguleg
using System.Linq;
using System.Web;

/*
* University of Reykjavík
* Brjóstagjöf.is is the product of first-year practical programming course
* for computer science students at said university
*
* URL: http://code.google.com/p/scags 
* Authors: 
* Ástvaldur Sigurðsson
* Guðjón Jónsson
* Kristín Inga Vigfúsdóttir
* Steinar Bragi Sigurðsson
* Sveinn Ernstsson
*/
namespace skags.Models
{
     /* Gagnagrunnsklasi. Föll hans sjá um að sækja og senda grunnnotendagögn inn í gagnagrunn */
    public class UserRepository
    {
        DBDataContext dc = new DBDataContext();

        // Fall sem vistar breytingar gerðar á gagnagrunni
        public void Save()
        {
            dc.SubmitChanges();
        }

        // Fall sem sækir ákveðinn notanda eftir ID hans
        public UserInfo GetUserByID(int id)
        {
            return dc.UserInfos.SingleOrDefault(u => u.ID == id);
        }

        // Fall sem sækir notandanafn ákveðins notanda eftir ID hans
        public string GetUsernameByID(int id)
        {
            return (from s in dc.UserInfos
                    join u in dc.aspnet_Users on s.UserID equals u.UserId
                    where s.ID == id
                    select u.UserName).SingleOrDefault();
        }

        // Fall sem sækir fullt nafn ákveðins notanda eftir ID hans
        public string GetNameByHashID(System.Guid id)
        {
            var info = dc.UserInfos.SingleOrDefault(u => u.UserID == id).FullName;

            return String.IsNullOrEmpty(info) || info == " " ? "Ónefndur" : info;
        }

        // Fall sem sækir hash ID ákveðins notanda eftir notandanafni hans
        public System.Guid GetHashIDByUsername(string userid)
        {
            return dc.aspnet_Users.SingleOrDefault(u => u.UserName == userid).UserId;
        }
        
        // Fall sem sækir ID ákveðins notanda eftir notandanafni hans
        public int GetIDByUsername(string username)
        {
            return (from s in dc.aspnet_Users
                    join u in dc.UserInfos on s.UserId equals u.UserID
                    where s.UserName == username
                    select u.ID).SingleOrDefault();
        }

        // Fall sem sækir hash ID ákveðins notanda eftir ID hans
        public System.Guid GetHashIDByID(int userid)
        {
            return dc.UserInfos.SingleOrDefault(u => u.ID == userid).UserID;
        }
        
        // Fall sem sækir ID ákveðins notanda eftir hash ID hans
        public int GetIDByHashID(System.Guid hash)
        {
            return dc.UserInfos.SingleOrDefault(s => s.UserID == hash).ID;
        }

        // Fall sem sækir hlutverk/stöðu ákveðins notanda eftir hash ID hans
        public string GetRoleByHashID(System.Guid hash)
        {
            return    (from u in dc.aspnet_UsersInRoles
                       join r in dc.aspnet_Roles on u.RoleId equals r.RoleId
                       join a in dc.aspnet_Users on u.UserId equals hash
                       where u.UserId == a.UserId && u.UserId == hash
                       select r.RoleName).First();
            
        }

        // Fall sem skilar collectioni af öllum notendum
        public IEnumerable<UserTablesViewModel> GetAllUsers()
        {
            var result = from s in dc.UserInfos
                         join i in dc.aspnet_Users on s.UserID equals i.UserId
                         orderby s.ID descending
                         select new UserTablesViewModel
                         {
                             ID = s.ID,
                             UserId = i.UserId,
                             UserName = i.UserName,
                             LastActive = i.LastActivityDate,
                             FullName = s.FullName,
                             SSN = s.SSN,
                             Address = s.Address,
                             ZipCode = s.ZipCode,
                             IsNaughty = s.IsNaughty,
                             Description = s.Description,
                             ProfilePic = s.ProfilePic,
                             FacebookUrl = s.FacebookUrl,
                             RoleId = ( from uir in dc.aspnet_UsersInRoles
                                        where s.UserID == uir.UserId
                                        select uir
                                        ).FirstOrDefault().RoleId,
                             RoleName = ( from r in dc.aspnet_Roles
                                          where r.RoleId == (from uir in dc.aspnet_UsersInRoles
                                                             where s.UserID == uir.UserId
                                                             select uir
                                                            ).FirstOrDefault().RoleId
                                          select r
                                          ).FirstOrDefault().RoleName
                         };

            return result;
        }

        // Fall sem nær í nýjasta notandann
        public UserInfo GetNewestUser()
        {
            var result = (from s in dc.UserInfos
                          orderby s.ID descending
                          select s).First();
            return result;
        }


        // Fall sem bætir notanda í gagnagrunn
        public void AddUser(UserInfo User)
        {
            dc.UserInfos.InsertOnSubmit(User);
            Save();
        }

        // Fall sem uppfærir notanda
        public void UpdateUser(UserInfo User)
        {
            // Sækjum notandann úr gagnagrunninum
            var theUser = GetUserByID(User.ID);
            // Hún verður að skila til baka notanda
            if (theUser != null)
            {
                theUser.FullName = User.FullName;
                theUser.SSN = User.SSN;
                theUser.Address = User.Address;
                theUser.ZipCode = User.ZipCode;
                theUser.Description = User.Description;
                theUser.FacebookUrl = User.FacebookUrl;
                theUser.IsNaughty = User.IsNaughty;

                Save();
            }
        }

        // Fall sem eyðir notanda úr gagnagrunni
        public bool DeleteUser(int id)
        {
            // Sækjum upplýsingar um notandann
            var theUser = (from s in dc.UserInfos
                                 join u in dc.aspnet_Users on s.UserID equals u.UserId
                                 where s.ID == id
                                 select u.UserId).SingleOrDefault();

            // Ef hún skilar ekki til baka niðurstöðum skilum við false
            if (theUser == null)
                return false;

            // Stored Procedure sem eyðir notanda úr ÖLLUM töflum
            dc.Delete_ASPNET_User(theUser);

            return true;
        }

        // Uppfærir hlutverk notanda (stjórnandi, fagmaður, venjulegur notandi)
        public void UpdateUserRoles(int user, string role)
        {
            /*
             * Fagfólk
             */

            if( GetUsernameByID(user) == HttpContext.Current.User.Identity.Name)
                // Stjórnandi getur ekki tekið stjórnunarréttindi af sjálfum sér
                throw new Exception("Þú getur ekki breytt réttindum á sjálfum þér!");

            if (role == "Fagfolk")
            {
                // Ef notandinn er ekki fagmaður
                if (dc.aspnet_UsersInRoles_IsUserInRole("/", GetUsernameByID(user), "Fagfolk") == 0)
                {
                    // Gerum hann að fagmanni og tökum hann út sem stjórnanda
                    dc.aspnet_UsersInRoles_AddUsersToRoles("/", GetUsernameByID(user), "Fagfolk", DateTime.Now);
                    dc.aspnet_UsersInRoles_RemoveUsersFromRoles("/", GetUsernameByID(user), "Admin");
                }
                // Notandinn er fagmaður
                else
                {
                    // Tökum hann út sem fagmann
                    dc.aspnet_UsersInRoles_RemoveUsersFromRoles("/", GetUsernameByID(user), "Fagfolk");
                }
            }

            /*
                * Stjórnandi
                */

            if (role == "Admin")
            {
                // Ef notandinn er ekki stjórnandi
                if (dc.aspnet_UsersInRoles_IsUserInRole("/", GetUsernameByID(user), "Admin") == 0)
                {
                    // Gerum hann að stjórnanda og tökum hann út sem fagmann
                    dc.aspnet_UsersInRoles_AddUsersToRoles("/", GetUsernameByID(user), "Admin", DateTime.Now);
                    dc.aspnet_UsersInRoles_RemoveUsersFromRoles("/", GetUsernameByID(user), "Fagfolk");
                }
                // Notandinn er stjórnandi
                else
                {
                    // Tökum hann út sem stjórnanda
                    dc.aspnet_UsersInRoles_RemoveUsersFromRoles("/", GetUsernameByID(user), "Admin");
                }
            }
        }
    }
}